Intro Datenanalyse 1

Jan-Philipp Kolb

27 April 2017

Warum R nutzen

Gründe für die Nutzung von R

Gründe

Übersicht - warum R

R lässt sich kombinieren…

R für SPSS Nutzer

install.packages("Rcmdr")
library("Rcmdr")

Bob Munich - R for SPSS and SAS Users

Die Popularität von R

R Nutzer rund um die Welt

R Welt

R Welt

Wo sind die aktivsten Nutzer?

Aktivität Nutzer

Aktivität Nutzer

Erwartungen und Anforderungen

Das kann diese Schulung vermitteln:

Erwartungen und Anforderungen II

Das kann sie nicht leisten:

R herunterladen:

http://www.r-project.org/

Probleme mit Excel

Weil andere Programme große Fehler haben:

Probleme mit Excel

Vergleich mit anderen Programmen

Dein Freund das GUI

Open Source Programm R

https://cran.r-project.org/

Graphisches User Interface

Aber die meisten Menschen nutzen einen Editor oder ein graphical user interface (GUI).

Aus den folgenden Gründen:

Verschiedene GUIs

rstudio

rstudio

Download der Unterlagen

Auf github sind alle Unterlagen für diesen Kurs zu finden.

Wie nutzt man github?

Rstudio

Aufgabe - Vorbereitung

date()
## [1] "Thu Apr 27 21:45:43 2017"
sessionInfo()
## R version 3.3.3 (2017-03-06)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 7 x64 (build 7601) Service Pack 1
## 
## locale:
## [1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252   
## [3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
## [5] LC_TIME=German_Germany.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] backports_1.0.5 magrittr_1.5    rprojroot_1.2   tools_3.3.3    
##  [5] htmltools_0.3.5 yaml_2.1.13     Rcpp_0.12.6     stringi_1.1.1  
##  [9] rmarkdown_1.4   knitr_1.15.1    stringr_1.2.0   digest_0.6.12  
## [13] evaluate_0.10

Grundlagen im Umgang mit der Sprache R

R ist eine Objekt-orientierte Sprache

Vektoren und Zuweisungen

b <- c(1,2) # erzeugt ein Objekt mit den Zahlen 1 und 2
mean(b) # berechnet den Mittelwert
## [1] 1.5

Mit den folgenden Funktionen können wir etwas über die Eigenschaften des Objekts lernen:

length(b) # b hat die Länge 2
## [1] 2

Objektstruktur

str(b) # b ist ein numerischer Vektor
##  num [1:2] 1 2

Funktionen im base-Paket

Funktion Bedeutung Beispiel
length() Länge length(b)
max() Maximum max(b)
min() Minimum min(b)
sd() Standardabweichung sd(b)
var() Varianz var(b)
mean() Mittelwert mean(b)
median() Median median(b)

Diese Funktionen brauchen nur ein Argument.

Funktionen mit mehr Argumenten

Andere Funktionen brauchen mehr:

Argument Bedeutung Beispiel
quantile() 90 % Quantile quantile(b,.9)
sample() Stichprobe ziehen sample(b,1)

Beispiel - Funktionen mit einem Argument

max(b)
## [1] 2
min(b)
## [1] 1
sd(b)
## [1] 0.7071068
var(b)
## [1] 0.5

Funktionen mit einem Argument

mean(b)
## [1] 1.5
median(b)
## [1] 1.5

Funktionen mit mehr Argumenten

quantile(b,.9)
## 90% 
## 1.9
sample(b,1) 
## [1] 2

Übersicht Befehle

http://cran.r-project.org/doc/manuals/R-intro.html

Aufgabe - Zuweisungen und Funktionen

Erzeugen Sie einen Vektor b mit den Zahlen von 1 bis 5 und berechnen Sie…

  1. den Mittelwert

  2. die Varianz

  3. die Standardabweichung

  4. die quadratische Wurzel aus dem Mittelwert

Datentypen und Indizieren

Verschiedene Datentypen

Datentyp Beschreibung Beispiel
numeric ganze und reele Zahlen 5, 3.462
logical logische Werte FALSE, TRUE
character Buchstaben und Zeichenfolgen “Hallo”

Quelle: R. Münnich und M. Knobelspieß (2007): Einführung in das statistische Programmpaket R

Verschiedene Datentypen

b <- c(1,2) # numeric
log <- c(T,F) # logical
char <-c("A","b") # character
fac <- as.factor(c(1,2)) # factor

Mit str() bekommt man den Objekttyp.

Indizieren eines Vektors:

A1 <- c(1,2,3,4)
A1
## [1] 1 2 3 4
A1[1]
## [1] 1
A1[4]
## [1] 4
A1[1:3]
## [1] 1 2 3
A1[-4]
## [1] 1 2 3

data.frames

Beispieldaten generieren:

AGE <- c(20,35,48,12)
SEX <- c("m","w","w","m")

Diese beiden Vektoren zu einem data.frame verbinden:

Daten <- data.frame(Alter=AGE,Geschlecht=SEX)

Anzahl der Zeilen/Spalten herausfinden

nrow(Daten) # Zeilen
## [1] 4
ncol(Daten) # Spalten
## [1] 2

Indizieren

Indizieren eines dataframe:

AA <- 4:1
A2 <- cbind(A1,AA)
A2[1,1]
## A1 
##  1
A2[2,]
## A1 AA 
##  2  3
A2[,1]
## [1] 1 2 3 4
A2[,1:2]
##      A1 AA
## [1,]  1  4
## [2,]  2  3
## [3,]  3  2
## [4,]  4  1

Matrizen und Arrays

A <- matrix(seq(1,100), nrow = 4)
dim(A)
## [1]  4 25

Ein Array erzeugen

A3 <- array(1:8,c(2,2,2))
A3
## , , 1
## 
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## , , 2
## 
##      [,1] [,2]
## [1,]    5    7
## [2,]    6    8

Indizieren eines Array

A3[,,2]
##      [,1] [,2]
## [1,]    5    7
## [2,]    6    8

Listen

Indizieren einer Liste

A4 <- list(A1,1)
A4
## [[1]]
## [1] 1 2 3 4
## 
## [[2]]
## [1] 1
A4[[2]]
## [1] 1

Logische Operatoren

# Ist 1 größer als 2?
1>2
## [1] FALSE
1<2
## [1] TRUE
1==2
## [1] FALSE

Operatoren um Subset für Datensatz zu bekommen

Diese Operatoren eignen sich gut um Datensätze einzuschränken

Daten
##   Alter Geschlecht
## 1    20          m
## 2    35          w
## 3    48          w
## 4    12          m
Daten[AGE>20,]
##   Alter Geschlecht
## 2    35          w
## 3    48          w

Datensätze einschränken

Daten[SEX=="w",]
##   Alter Geschlecht
## 2    35          w
## 3    48          w
# gleiches Ergebnis:
Daten[SEX!="m",]
##   Alter Geschlecht
## 2    35          w
## 3    48          w

Weitere wichtige Optionen

# Ergebnis in ein Objekt speichern
subDat <- Daten[AGE>20,]
# mehrere Bedingeungen können mit
# & verknüpft werden:
Daten[AGE>18 & SEX=="w",]
##   Alter Geschlecht
## 2    35          w
## 3    48          w

Sequenzen

# Sequenz von 1 bis 10
1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
Daten[1:3,]
##   Alter Geschlecht
## 1    20          m
## 2    35          w
## 3    48          w

Weitere Sequenzen

seq(-2,8,by=1.5)
## [1] -2.0 -0.5  1.0  2.5  4.0  5.5  7.0
a <-seq(3,12,length=12)

b <- seq(to=5,length=12,by=0.2)

d <- 1:10
d <- seq(1,10,1)
d <- seq(length=10,from=1,by=1)

Wiederholungen

# wiederhole 1 10 mal
rep(1,10)
##  [1] 1 1 1 1 1 1 1 1 1 1
rep("A",10)
##  [1] "A" "A" "A" "A" "A" "A" "A" "A" "A" "A"

Die Funktion paste

?paste
paste(1:4)
## [1] "1" "2" "3" "4"
paste("A", 1:6, sep = "")
## [1] "A1" "A2" "A3" "A4" "A5" "A6"

Wie bekommt man Hilfe?

Wie bekommt man Hilfe?

help.start()
help(name)
?mean
example(lm)

Nutzung Suchmaschinen

R-project + Was ich schon immer wissen wollte

Stackoverflow

Ein Schummelzettel - Cheatsheet

https://www.rstudio.com/resources/cheatsheets/

Modularer Aufbau von R

Modularer Aufbau

Modularer Aufbau

install.packages("lme4")

library(lme4)

Installation von Paketen mit RStudio

Vorhandene Pakete und Installation

Übersicht viele nützliche Pakete:

Die wichtigsten Pakete zur Visualisierung mit R:

Pakete Regression

Big Data

Weitere interessante Pakete

Paket für den Import/Export - foreign

Pakete von Github installieren

install.packages("devtools")
library(devtools)

install_github("hadley/ggplot2")

Wie bekomme ich einen Überblick

Aufgabe - Zusatzpakete

Gehen Sie auf <cran.r-project.org> und suchen Sie in dem Bereich, wo die Pakete vorgestellt werden, nach Paketen,…

Datenimport

Datenimport

Dateiformate in R

Formate - base package

R unterstützt von Haus aus schon einige wichtige Formate:

Der Arbeitsspeicher

So findet man heraus, in welchem Verzeichnis man sich gerade befindet

getwd()

So kann man das Arbeitsverzeichnis ändern:

Man erzeugt ein Objekt in dem man den Pfad abspeichert:

main.path <- "C:/" # Beispiel für Windows
main.path <- "/users/Name/" # Beispiel für Mac
main.path <- "/home/user/" # Beispiel für Linux

Und ändert dann den Pfad mit setwd()

setwd(main.path)

Bei Windows ist es wichtig Slashs anstelle von Backslashs zu verwenden.

Alternative - Arbeitsspeicher

Import von Excel-Daten

library(foreign)
?read.csv
?read.csv2

CSV Dateien einlesen

Zunächst muss das Arbeitsverzeichnis gesetzt werden, in dem sich die Daten befinden:

Dat <- read.csv("schuldaten_export.csv")

Wenn es sich um Deutsche Daten handelt:

Dat <- read.csv2("schuldaten_export.csv")

SPSS Dateien einlesen

Dateien können auch direkt aus dem Internet geladen werden:

link<- "http://www.statistik.at/web_de/static/
mz_2013_sds_-_datensatz_080469.sav"

?read.spss
Dat <- read.spss(link,to.data.frame=T)

stata Dateien einlesen

MZ02 <- read.dta("MZ02.dta")

Das Paket rio

install.packages("rio")
library("rio")
x <- import("mtcars.csv")
y <- import("mtcars.rds")
z <- import("mtcars.dta")

Datenmanagement ähnlich wie in SPSS oder Stata

install.packages("Rz")
library(Rz)

Weitere Alternative Rcmdr

install.packages("Rcmdr")
library(Rcmdr)

Aufgabe - Datenimport

Datenexport

Datenexport

R’s Exportformate

Beispieldatensatz erzeugen

A <- c(1,2,3,4)
B <- c("A","B","C","D")

mydata <- data.frame(A,B)

Überblick Daten Import/Export

save(mydata, file="mydata.RData")

Daten in Excel Format abspeichern

write.csv(mydata,file="mydata.csv") 
library(xlsx)
write.xlsx(mydata,file="mydata.xlsx") 

Daten in stata Format abspeichern

library(foreign)
write.dta(mydata,file="mydata.dta") 

Auch zum Export eignet sich das rio Paket

library("rio")

export(mtcars, "mtcars.csv")
export(mtcars, "mtcars.rds")
export(mtcars, "mtcars.dta")

Exkurs: Datenquellen

Datenzugang

Datenquellen

library("FAOSTAT")
library(survey)
data(nhanes)

Das R-Paket datasets

library(datasets)

Beispiel Erdbeben Datensatz:

head(quakes)

Datensatz zum US Zensus

library(UScensus2010)

Weltbank Daten

WDI - World Development Indicators (World Bank) - Einführung in das Paket

library(WDI)
WDIsearch('gdp')[1:10,]

Nutzung von WDI Daten

dat <-  WDI(indicator='NY.GDP.PCAP.KD', country=c('MX','CA','US'), start=1960, end=2012)
head(dat)

Erste Grafik mit WDI Daten

OpenStreetMap

OpenStreetMap (OSM) ist ein kollaboratives Projekt um eine editierbare Weltkarte zu erzeugen.

Wikipedia - OpenStreetMap

Download von OpenStreetMap Daten

library(osmar)
api <- osmsource_api()
library(ggmap)
cityC <- geocode("Berlin",source="google")
bb <- center_bbox(cityC$lon,cityC$lat,1000, 1000)
uaBerlin <- get_osm(bb, source = api)

TwittR

library(twitteR)
library(streamR)

http://www.r-bloggers.com/mapping-the-world-with-tweets-including-a-gif-without-cats-and-a-shiny-app/

worldHires Daten

library(mapdata)
data(worldHiresMapEnv)
map('worldHires', col=1:10)

Historische Daten

library(HistData)
data(Arbuthnot)

GDELT Daten

library(GDELTtools)
test.filter <- list(ActionGeo_ADM1Code=c("NI", "US"), ActionGeo_CountryCode="US")
test.results <- GetGDELT(start.date="1979-01-01", end.date="1979-12-31",
                         filter=test.filter)

Andere Datenquellen

link1 <- "http://openflights.svn.sourceforge.net/viewvc/openflights/
openflights/data/airports.dat"
airport <- read.csv(link1, header = F)

link2 <- "http://openflights.svn.sourceforge.net/viewvc/openflights/
openflights/data/routes.dat"
route <- read.csv(link2, header = F)
link <- "http://www.fa-technik.adfc.de/code/opengeodb/DE9.tab"
info <- read.csv(link,sep="\t",header=F)

Weitere Quellen

Datenanalyse

Streuungsmaße

Im base Paket sind die wichtigsten Streuungsmaße enthalten:

ab <- rnorm(100); var(ab)
## [1] 0.905472
sd(ab); range(ab)
## [1] 0.9515629
## [1] -2.928560  2.096803

Extremwerte

min(ab)
## [1] -2.92856
max(ab)
## [1] 2.096803

Fehlende Werte

ab[10] <- NA

var(ab)
## [1] NA

Bei fehlenden Werten muss ein weiteres Argument mitgegeben werden:

var(ab,na.rm=T)
## [1] 0.896406

Häufigkeiten und gruppierte Kennwerte

x <- sample(1:10,100,replace=T)

table(x)
## x
##  1  2  3  4  5  6  7  8  9 10 
##  9 10 17 14  6 10  6 10  9  9

Tabellieren - weiteres Beispiel

musician <- sample(c("yes","no"),100,replace=T)
?table
table(x)
## x
##  1  2  3  4  5  6  7  8  9 10 
##  9 10 17 14  6 10  6 10  9  9
table(x,musician)
##     musician
## x    no yes
##   1   5   4
##   2   3   7
##   3  11   6
##   4   4  10
##   5   4   2
##   6   5   5
##   7   4   2
##   8   7   3
##   9   5   4
##   10  3   6

Eine weitere Tabelle

data(esoph)
table(esoph$agegp)
## 
## 25-34 35-44 45-54 55-64 65-74   75+ 
##    15    15    16    16    15    11

Häufigkeitstabellen

Die Funktion prop.table()

table(esoph$agegp,esoph$alcgp)
##        
##         0-39g/day 40-79 80-119 120+
##   25-34         4     4      3    4
##   35-44         4     4      4    3
##   45-54         4     4      4    4
##   55-64         4     4      4    4
##   65-74         4     3      4    4
##   75+           3     4      2    2

Die Funktion prop.table

?prop.table
prop.table(table(esoph$agegp,
esoph$alcgp),1)
##        
##         0-39g/day     40-79    80-119      120+
##   25-34 0.2666667 0.2666667 0.2000000 0.2666667
##   35-44 0.2666667 0.2666667 0.2666667 0.2000000
##   45-54 0.2500000 0.2500000 0.2500000 0.2500000
##   55-64 0.2500000 0.2500000 0.2500000 0.2500000
##   65-74 0.2666667 0.2000000 0.2666667 0.2666667
##   75+   0.2727273 0.3636364 0.1818182 0.1818182

Die aggregate Funktion

aggregate(state.x77,by=list(state.region),mean)
##         Group.1 Population   Income Illiteracy Life Exp    Murder  HS Grad
## 1     Northeast   5495.111 4570.222   1.000000 71.26444  4.722222 53.96667
## 2         South   4208.125 4011.938   1.737500 69.70625 10.581250 44.34375
## 3 North Central   4803.000 4611.083   0.700000 71.76667  5.275000 54.51667
## 4          West   2915.308 4702.615   1.023077 71.23462  7.215385 62.00000
##      Frost      Area
## 1 132.7778  18141.00
## 2  64.6250  54605.12
## 3 138.8333  62652.00
## 4 102.1538 134463.00

x: ein oder mehrere Beobachtungsvektor(en) für den der Kennwert berechnet werden soll

by: eine oder mehrere bedingende Variable(n)

FUN: die Funktion welche den Kennwert berechnet (z.B. mean oder sd)

Beispieldatensatz - apply Funktion

ApplyDat <- cbind(1:4,runif(4),rnorm(4))
apply(ApplyDat,1,mean)
## [1] 0.2525712 1.4252776 1.0209842 1.8218634
apply(ApplyDat,2,mean)
## [1] 2.5000000 0.7689200 0.1216024

Die Funktion apply

apply(ApplyDat,1,var)
## [1] 0.8120648 0.2849767 3.4899658 3.5719706
apply(ApplyDat,1,sd)
## [1] 0.9011464 0.5338321 1.8681450 1.8899658
apply(ApplyDat,1,range)
##            [,1]      [,2]       [,3]     [,4]
## [1,] -0.7481021 0.9449207 -0.7118865 0.615486
## [2,]  1.0000000 2.0000000  3.0000000 4.000000
apply(ApplyDat,1,length)
## [1] 3 3 3 3

Argumente der Funktion apply

Die Funktion tapply

ApplyDat <- data.frame(Income=rnorm(5,1400,200),
                       Sex=sample(c(1,2),5,replace=T))
ApplyDat
##     Income Sex
## 1 1257.376   1
## 2 1071.330   1
## 3 1105.388   1
## 4 1390.398   2
## 5 1177.605   1

Beispiel Funktion tapply

tapply(ApplyDat$Income,ApplyDat$Sex,mean)
##        1        2 
## 1152.925 1390.398
tapply(ApplyDat$Income,
       ApplyDat$Sex,function(x)x)
## $`1`
## [1] 1257.376 1071.330 1105.388 1177.605
## 
## $`2`
## [1] 1390.398

Aufgabe - Apply Funktion anwenden

Zurück zur Gliederung.